package com.wlsk.license.service.export;

import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.wlsk.license.cache.UserSessionManager;
import com.wlsk.license.common.enums.RetEnum;
import com.wlsk.license.common.exception.BusinessException;
import com.wlsk.license.common.execl.AbstractExcelExportService;
import com.wlsk.license.dao.mapper.PlateMapper;
import com.wlsk.license.dto.ExportDto;
import com.wlsk.license.dto.request.PlateDraftPageReqDto;
import com.wlsk.license.dto.response.PlateDraftPageResultDto;
import com.wlsk.license.dto.response.feign.UserResDto;
import com.wlsk.license.service.ISysDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @description: 包车牌导出服务
 * @author: liuzhangbin
 * @date: 2025/2/18
 */
@Service
public class PlateExportService extends AbstractExcelExportService<PlateDraftPageResultDto, PlateDraftPageReqDto> {

    @Autowired
    private ISysDictService sysDictService;

    @Override
    protected List<PlateDraftPageResultDto> data(PlateDraftPageReqDto reqDto) {
        resetReqDto(reqDto);
        PlateMapper plateMapper = SpringUtil.getBean(PlateMapper.class);
        return plateMapper.selectPlateDraftPage(reqDto);
    }

    @Override
    public String getName(PlateDraftPageReqDto reqDto) {
        resetReqDto(reqDto);
        // 获取数据列表
        PlateMapper plateMapper = SpringUtil.getBean(PlateMapper.class);
        List<PlateDraftPageResultDto> dataList = plateMapper.selectPlateDraftPage(reqDto);
        // 如果数据为空，返回默认名称
        if (dataList == null || dataList.isEmpty()) {
            return "包车牌申请";
        }
        // 找出create_time的最大值和最小值
        LocalDateTime minTime = null;
        LocalDateTime maxTime = null;
        for (PlateDraftPageResultDto dto : dataList) {
            if (dto.getCreateTime() != null) {
                if (minTime == null || dto.getCreateTime().isBefore(minTime)) {
                    minTime = dto.getCreateTime();
                }
                if (maxTime == null || dto.getCreateTime().isAfter(maxTime)) {
                    maxTime = dto.getCreateTime();
                }
            }
        }
        // 如果没有找到有效的时间，返回默认名称
        if (minTime == null || maxTime == null) {
            return "包车牌申请";
        }
        // 格式化时间并生成文件名
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        String startTimeStr = minTime.format(formatter);
        String endTimeStr = maxTime.format(formatter);
        // 如果开始时间和结束时间相同，只显示一个日期
        if (startTimeStr.equals(endTimeStr)) {
            return String.format("包车牌申请%s", startTimeStr);
        } else {
            return String.format("包车牌申请%s-%s", startTimeStr, endTimeStr);
        }
    }

    @Override
    public Class getDataClass() {
        return PlateDraftPageResultDto.class;
    }

    public long getLimit() {
        return 5000;
    }

    /**
     * 导出Excel并返回包含URL和文件名的对象
     *
     * @param reqDto 导出请求参数
     * @return 包含URL和文件名的ExportDto对象
     */
    @Override
    public ExportDto exportWithFileName(PlateDraftPageReqDto reqDto) {
        // 直接调用父类的exportWithFileName方法
        return super.exportWithFileName(reqDto);
    }

    /**
     * 重置列表查询参数
     * @param reqDto
     */
    private void resetReqDto(PlateDraftPageReqDto reqDto) {
        UserResDto userReqDto = UserSessionManager.getMerchantUser(reqDto.getUid());
        if(CollectionUtils.isNotEmpty(reqDto.getOrgOrDptList())) {
            List<PlateDraftPageReqDto.OrgOrDptVo> orgOrDptList = reqDto.getOrgOrDptList();
            List<Long> orgIdList = orgOrDptList.stream().filter(o -> o.getOrgOrDptType().equals(1)).map(PlateDraftPageReqDto.OrgOrDptVo::getOrgId).collect(Collectors.toList());
            if(userReqDto.getDeptId() != null) {
                // 该用户绑定了部门，只能查询该部门数据
                orgIdList.remove(userReqDto.getOrgId());
            }
            List<Long> deptIdList = orgOrDptList.stream().filter(o -> o.getOrgOrDptType().equals(2)).map(PlateDraftPageReqDto.OrgOrDptVo::getOrgId).collect(Collectors.toList());
            reqDto.setOrgIdList(orgIdList);
            reqDto.setDeptIdList(deptIdList);
        } else {
            List<Long> orgIdList = sysDictService.userOrgIdList(reqDto.getUid());
            if(userReqDto.getDeptId() != null) {
                // 该用户绑定了部门，只能查询该部门数据
                orgIdList.remove(userReqDto.getOrgId());
            }
            reqDto.setOrgIdList(orgIdList);
            reqDto.setDeptIdList(sysDictService.userDeptIdList(reqDto.getUid()));
        }
        if(CollectionUtils.isEmpty(reqDto.getOrgIdList()) && CollectionUtils.isEmpty(reqDto.getDeptIdList())) {
            log.error("用户未绑定机构或部门，无法查询数据：{}", reqDto);
            throw new BusinessException(RetEnum.PARAM_ERROR);
        }
    }
}